#ifndef QMLCONTROLINTERFACE_H
#define QMLCONTROLINTERFACE_H

#include <QObject>
#include <QString>
#include <QQmlEngine>
#include <QJSValue>

/**
 * QML控制接口类
 * 用于C++代码调用QML中的控制函数，避免代码重复
 * 符合华为C语言编程规范和GJB 8114-2013要求
 */
class QMLControlInterface : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY(QMLControlInterface)

public:
    explicit QMLControlInterface(QObject *parent = nullptr);
    ~QMLControlInterface() = default;

    // 设置QML上下文对象
    void setQMLContext(QObject *contextObject);

    // =============== 控制函数接口 ===============
    
    /**
     * 发送转向控制指令 (D121)
     * @param value 转向控制值（负12到12）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendSteeringControl(int value);

    /**
     * 发送行进控制指令 (D122)
     * @param value 行进控制值（负25到25）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendMovementControl(int value);

    /**
     * 发送发电机启动控制指令 (D123)
     * @param value 发电机控制值（0关闭，1启动，2停机）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendGeneratorControl(int value);

    /**
     * 发送220V继电器控制指令 (D124)
     * @param value 继电器控制值（0关闭，1直接打开）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendRelayControl(int value);

    /**
     * 发送喷水控制指令 (D125)
     * @param value 喷水控制值（0关闭，1直接打开）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendSprayControl(int value);

    /**
     * 发送制冷自动控制/手动启动指令 (D126)
     * @param value 制冷控制值（0关闭，1直接打开，2自动）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendCoolingControl(int value);

    /**
     * 发送控速指令 (D127)
     * @param speedValue 行进速度百分比控制值（0-50）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendSpeedControl(int speedValue);

    /**
     * 发送割叶机控制指令 (D128)
     * @param value 割叶机控制值（0关闭，1直接打开）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendCutterControl(int value);

    /**
     * 发送平台遥控模式指令 (D120)
     * @param commandValue 指令值（1为平台遥控模式，0为权限释放）
     * @return 是否发送成功
     */
    Q_INVOKABLE bool sendPlatformRemoteMode(int commandValue);

    /**
     * 紧急停止：执行完整的设备停止序列
     * @return 是否成功开始紧急停止流程
     */
    Q_INVOKABLE bool emergencyStop();

signals:
    /**
     * 控制命令发送完成信号
     * @param commandName 命令名称
     * @param success 是否成功
     * @param errorMessage 错误信息（如果失败）
     */
    void controlCommandCompleted(const QString &commandName, bool success, const QString &errorMessage);

private:
    QObject *m_qmlContext;  // QML上下文对象
    bool callQMLFunction(const QString &functionName, const QJSValueList &args = QJSValueList());

    // 函数指针缓存，提高调用效率
    QJSValue m_steeringFunction;
    QJSValue m_movementFunction;
    QJSValue m_generatorFunction;
    QJSValue m_relayFunction;
    QJSValue m_sprayFunction;
    QJSValue m_coolingFunction;
    QJSValue m_speedFunction;
    QJSValue m_cutterFunction;
    QJSValue m_platformFunction;
    QJSValue m_emergencyStopFunction;

    // 初始化函数缓存
    void initializeFunctionCache();
};

#endif // QMLCONTROLINTERFACE_H